|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(******************************************************************************) (**) ОТДЕЛ ПроQR+; (****************************************************************************** * НАЗНАЧЕНИЕ: * решение систем линейных уравнений (A*x=b) методом QR-разложения * * ПРИМЕЧАНИЯ: * Система уравнений записана в файле "ПроМатр2.дан". * В этом файле 1-я строка содержит размер матрицы A * (число строк и столбцов), в следующих строках записанны значения элементов * матрицы A, потом на отдельной строке размер матрицы свободных членов B * (число векторов b и их размер), а далее значения элементов матрицы B, * в которой строки являются векторами b. * * Прямоугольная матрица A (N на M, с N >= M) раскладывается на два * сомножителя (A=Q*R), где Q (N на M) ортогональная матрица, а * R (M на M) - верхняя треугольная матрица. Получаем Q*R*x = b, далее * R*x = Q'b. Последняя система решается методом обратной подстановки. * Если система несовместна (N > M), то метод возвращает такой вектор x, * для которого A*x является наилучшим приближением к b (по норме). ******************************************************************************) ИСПОЛЬЗУЕТ Матр ИЗ "...\Отделы\Числа\", МатрВВ ИЗ "...\Отделы\Числа\", Читать ИЗ "...\Отделы\Обмен\", Вывод ИЗ "...\Отделы\Обмен\"; (******************************************************************************) ЗАДАЧА Голова; ПОСТ TOL=1.D-8; (* собственные значения обнуляются, если они более чем * в TOL раз меньше наибольшего собственного значения *) ПЕР n:ЦЕЛ; (* размер вектора свободных членов *) nv:ЦЕЛ; (* число векторов свободных членов *) A:Матр.Доступ; (* матрица системы *) R:Матр.Доступ; (* верхняя треугольная матрица *) B:Матр.Доступ; (* вектора свободных членов *) X:Матр.Доступ; (* вектора решения *) i:ЦЕЛ; п:Читать.Поток; УКАЗ п:=МатрВВ.ОткрытьПоток("ПроМатр2.дан"); A:=МатрВВ.ЧитатьМатр(п); B:=МатрВВ.ЧитатьМатр(п); Читать.Закрыть(п); nv:=РАЗМЕР(B^,0); n:=РАЗМЕР(B^,1); СОЗДАТЬ(R,n,n); СОЗДАТЬ(X,nv,n); Вывод.Цепь("^Исходная матрица:^"); МатрВВ.ВыводМатр("%10.5f",A^); Вывод.Цепь("^Вектора свободных членов:^"); ОТ i:=0 ДО nv-1 ВЫП МатрВВ.ВыводВект("%10.5f",B[i]) КОН; (* После выполнения РазложитьНаQR матрица Q оказывается на месте матрицы A *) ЕСЛИ Матр.РазложитьНаQR(A^,R^) = 0 ТО (* решаем систему для каждого вектора свободных членов b *) Вывод.Цепь("^Вектора решения:^"); ОТ i:=0 ДО nv-1 ВЫП Матр.РешитьИзQR(A^,R^,B[i],X[i]); МатрВВ.ВыводВект("%10.5f",X[i]) КОН ИНАЧЕ Вывод.Цепь("^Вырожденная матрица!^") КОН КОН Голова; (******************************************************************************) УКАЗ Голова КОН ПроQR. ▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|